package ru.pashkan.spring.server;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.GenericWebApplicationContext;

import javax.servlet.ServletContext;

// Этот класс нужен для того, чтобы в Spring MVC подгрузить бины других модулей.
// Иначе веб приложение не будет видеть их и соответственно не сможет использовать
// Будет появляться ошибка BeanNoFound или что то типа того
// Другое решение этой проблемы: в контексте Spring MVC - web.xml/
// contextConfigLocation и listener


@Component
public class CustomContextLoaderListener extends ContextLoaderListener implements BeanFactoryAware, ApplicationContextAware {

    private BeanFactory beanFactory;
    private ApplicationContext applicationContext;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    // Две реализации одной и той же штуки, использовать любой из них.
    // Во втором методе есть дополнительно параметр parent

//    @Override
//    protected WebApplicationContext createWebApplicationContext(ServletContext servletContext) throws BeansException {
//        GenericWebApplicationContext genericWebApplicationContext = new GenericWebApplicationContext();
//        genericWebApplicationContext.setParent( applicationContext );
//        genericWebApplicationContext.setServletContext( servletContext );
//        genericWebApplicationContext.refresh();
//        return genericWebApplicationContext;
//    }

    @Override
    protected WebApplicationContext createWebApplicationContext(ServletContext servletContext, ApplicationContext parent) throws BeansException {
        GenericWebApplicationContext genericWebApplicationContext = new GenericWebApplicationContext();
        genericWebApplicationContext.setParent(applicationContext);
        genericWebApplicationContext.setServletContext(servletContext);
        genericWebApplicationContext.refresh();
        return genericWebApplicationContext;
    }

    @Override
    public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {

        return null;
    }

    protected ApplicationContext loadParentContext(ServletContext servletContext) {
        return null;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}


